home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1459.dms / var1459.adf / Fonts / Fonts.doc < prev    next >
Text File  |  1992-05-02  |  48KB  |  1,368 lines

  1. 2    FONTS
  2.  
  3. 2.1  INTRODUCTION
  4.  
  5. In the previous chapters when we have printed text with help
  6. of the low level Text() function or the high level IntuiText
  7. structure, we have always used a font called "Topaz". The
  8. reason why we always have used this font is simply because it
  9. is the Amiga's default font and exist in ROM.
  10.  
  11. Topaz is, however, not the only font available on the Amiga.
  12. There exist thousands more, but these are not placed in ROM,
  13. they are loaded from disks. Loading fonts from disks is luckily
  14. quite a simple task since all necessary functions have already
  15. been written and exist in the "Diskfont Library".
  16.  
  17. In this chapter I will show you how to open the Diskfont
  18. Library, and use its functions. This involves finding out
  19. which fonts are available, loading them into memory and
  20. how to use them. I will also explain how to create your own
  21. fonts and use them in your own programs.
  22.  
  23.  
  24.  
  25. 2.2  FONTS
  26.  
  27. A font is a collection of graphical objects that represents
  28. characters. Since the Amiga was built as a graphical work
  29. station the system has been designed to handle all different
  30. types of fonts with great efficiency. Fonts of almost any size
  31. can be used, and the Amiga can itself convert fonts to styles
  32. like italic, underlined, bold, extended, and all possible
  33.  
  34. All fonts have a "Baseline" on which the characters are placed.
  35. Characters like "abcdef" will all be on and above the baseline.
  36. On the other hand, characters like "gjpqy" will also use some
  37. space under the baseline.
  38.  
  39. Here are three letters - 'a' 'b' and 'g'. As you can see will
  40. the 'g' use same space below the baseline. (The baseline is
  41. like normal rows on a paper.)
  42.  
  43.            #
  44.            #
  45.     ####   #
  46.         #  #
  47.         #  #
  48.         #  #
  49.     #####  #####   #####
  50.    #    #  #    # #    #
  51.    #    #  #    # #    #
  52.    #    #  #    # #    #
  53.    #    #  #    # #    #
  54.     ###### #####   ##### <= Baseline
  55.                        #
  56.                        #
  57.                   #    #
  58.                    ####
  59.  
  60.  
  61.  
  62.  
  63. 2.3  ROM FONTS
  64.  
  65. As said above, there exist for the moment only one ROM based
  66. font on the Amiga. It is Topaz and exist in two sizes, 8 and
  67. 9 pixels high. (ROM is like the normal memory in a computer,
  68. but when the computer is turned off the contents will still be
  69. intact. The disadvantage is that you can not change anything
  70. which is stored in ROM. ROM - "Read Only Memory".)
  71.  
  72. Topaz two sizes:
  73.  
  74.   - 9 pixels high (32 characters/row low resolution)
  75.                   (64     - " -      high resolution)
  76.   - 8 pixels high (40     - " -      low resolution)
  77.                   (80     - " -      high resolution)
  78.  
  79. Note! The limit on how many characters/row you can print simply
  80. depends on the width of the screen. In the above example I
  81. assume that low resolution means a 320 pixels wide display,
  82. and high resolution 640 pixels wide screen. Nowadays you can
  83. not be sure what the maximum width is simply because many
  84. users are now working on displays with overscan, extra large
  85. screens, see previous chapter for more information. I my
  86. self is currently using a 736 pixels wide and 540 lines tall
  87. display.
  88.  
  89.  
  90.  
  91. 2.3.1  TEXTATTR STRUCTURE
  92.  
  93. When you want to use a font you allocate a TextAttr structure
  94. (defined in the header file "graphics/text.h"). In the
  95. structure you write your requirements, the name of the font,
  96. height, style (normal, underlined, bold, italic...) and what
  97. type it is (if the font exist in ROM or on Disk).
  98.  
  99. The TextAttr structure look like this:
  100.  
  101. struct TextAttr
  102. {
  103.   STRPTR ta_Name;
  104.   UWORD ta_YSize;
  105.   UBYTE ta_Style;
  106.   UBYTE ta_Flags;
  107. };
  108.  
  109. ta_Name:  Name of the font together with the extension ".font".
  110.           For example: To get the font Topaz you should write
  111.           "topaz.font".
  112.  
  113. ta_YSize: The Height of the font. To get a 9 pixel high font
  114.           simply write 9.
  115.  
  116. ta_Style: There exist five different styles that may be
  117.           combined. The styles are: Normal, Underlined, Bold
  118.           Italic and Extended. You specify which styles you
  119.           want to use with the following flags: FS_NORMAL,
  120.           FSF_UNDERLINED, FSF_BOLD, FSF_ITALIC and
  121.           FSF_EXTENDED.
  122.           
  123.           To get a combination (e.g. Bold and Italic) use the
  124.           binary OR operator "|" (e.g. FSF_BOLD | FSF_ITALIC). 
  125.  
  126.           Note! If you ask for an underlined font for example,
  127.           it is not sure there exist one. You should then get
  128.           the font you want in the normal style, and then
  129.           change it with help of the SetSoftStyle() function.
  130.           (Explained later in this chapter.)
  131.  
  132. ta_Flags: This field tells the Amiga what type of font you
  133.           want. If it is a ROM based font write FPF_ROMFONT.
  134.           If it is a disk based font write FPF_DISKFONT.
  135.           (See below for a complete Flag list.)
  136.  
  137.  
  138. If you want to use the ROM font Topaz, 9 pixels high, normal
  139. style, you should initialize the TextAttr structure like this:
  140.  
  141.  
  142. struct TextAttr my_font_attr=
  143. {
  144.   "topaz.font", /* Name of the font.  */
  145.   9,            /* Height (in pixels) */
  146.   FS_NORMAL,    /* Style              */
  147.   FPF_ROMFONT   /* Exist in ROM.      */
  148. };
  149.  
  150.  
  151.  
  152. 2.3.2  OPEN ROM FONTS
  153.  
  154. After you have initialized the TextAttr structure you call the
  155. OpenFont() function to get access to a ROM font. The Amiga will
  156. open the font which closes matches your requirements in the
  157. TaxtAttr structure. If OpenFont() finds the font it returns a
  158. pointer to a TextFont structure and tells the system that you
  159. are using the font.
  160.  
  161. Synopsis: font = OpenFont( attr );
  162.  
  163. font:     (struct TextFont *) Pointer to a TextFont structure
  164.           which is declared in header file "graphics/text.h".
  165.           See below for more information about this structure.
  166.           If OpenFont() could not find the font it returns
  167.           NULL.
  168.  
  169. attr:     (struct TextAttr *) Pointer to an already initialized
  170.           TextAttr structure. OpenFont() will try to open the
  171.           font which closes matches your requirements.
  172.  
  173.  
  174.  
  175. 2.3.3  CLOSE ROM FONTS
  176.  
  177. All fonts you have opened must be "closed" before your program
  178. terminates! Since the font is in ROM no memory would be wasted
  179. if you forgot to close a previously opened font, but your
  180. program code would not look very good, so be careful. Close
  181. a font by calling the CloseFont() function.
  182.  
  183. Synopsis: CloseFont( font );
  184.  
  185. font:     (struct TextFont *) Pointer to a previously opened
  186.           TextFont structure. Note that you should NOT try to
  187.           close a font which you have not opened!
  188.  
  189.  
  190.  
  191. 2.4  DISK FONTS
  192.  
  193. Most fonts does not exist in ROM but are loaded from disks.
  194. The greatest advantage of loading fonts rather than including
  195. the fonts with the program itself is that several programs
  196. running at the same time can all use the same set of fonts.
  197. A lot of memory is therefore saved.
  198.  
  199.  
  200.  
  201. 2.4.1  DISKFONT LIBRARY
  202.  
  203. Most of the special routines which are involved with loading
  204. and using disk fonts are automatically taken care of by the
  205. Diskfont Library. Whenever you want to use disk fonts you
  206. should remember to open this library.
  207.  
  208. The diskfont library is opened as all other libraries with an
  209. OpenLibrary() call, and closed by and CloseLibrary() call. If
  210. the diskfont library not have already been opened by some
  211. other program it will be loaded from the system disk. (From
  212. the logical device "LIBS:", named "diskfont.library".
  213.  
  214. Here is an example:
  215.  
  216.   struct Library *DiskfontBase;
  217.  
  218.   DiskfontBase = (struct DiskfontBase *)
  219.     OpenLibrary( "diskfont.library", 0 );
  220.  
  221.   if( !DiskfontBase )
  222.     clean_up( "Could not open Diskfont library!" );
  223.  
  224.   ...
  225.  
  226.   if( DiskfontBase )
  227.     CloseLibrary( DiskfontBase );
  228.  
  229.  
  230.  
  231. 2.4.2  FINDING OUT WHICH FONTS ARE AVAILABLE
  232.  
  233. After you have opened the diskfont library you can use the
  234. special function AvailFonts() which will scan through the
  235. font directory of the system disk, and return a complete list
  236. of available fonts.
  237.  
  238. Synopsis: missing = AvailFonts( buffer, size, type );
  239.  
  240. missing:  (long) If the buffer was not big enough to store the
  241.           complete list of fonts in the extra number of bytes
  242.           needed is returned. If 0 is returned the buffer was
  243.           big enough for a complete list of fonts.
  244.  
  245. buffer:   (char *) Pointer to some memory were the list of
  246.           fonts can be stored.
  247.           
  248. size:     (long) The size of the buffer (in bytes).
  249.  
  250. type:     (long) If you want to look for available fonts which
  251.           are already in the memory set the flag "AFF_MEMORY".
  252.           If you want to search the disk for available fonts,
  253.           set the flag "AFF_DISK". To search both the memory
  254.           and the disk set both flags with the binary OR
  255.           operator between ("AFF_DISK | AFF_MEMORY").
  256.  
  257. The font list consists of a AvailFontsHeader structure followed
  258. by a list of AvailFonts structures (both declared in header
  259. file "libraries/diskfont.h"):
  260.  
  261. struct AvailFontsHeader
  262. {
  263.   UWORD afh_NumEntries;
  264. }; 
  265.  
  266. afh_NumEntries: Number of AvailFonts structures.
  267.  
  268.  
  269. struct AvailFonts
  270. {
  271.   UWORD af_Type;
  272.   struct TextAttr af_Attr;
  273. };
  274.  
  275. af_Type: If the font exist in memory the "AFF_MEMORY" flag is
  276.          set. If the font exist on the disk the "AFF_DISK" flag
  277.          is set.
  278.  
  279. af_Attr: An initialized TextAttr structure. This structure can
  280.          be examined to find the font's name, size, style etc...
  281.          (See above for more information about the TextAttr
  282.          structure.)
  283.  
  284.  
  285. It is impossible to know how big memory buffer you need for the
  286. AvailFonts() function. You can of course allocate a very big
  287. buffer and be quite sure it will be big enough, but this is not
  288. a good solution. A lot of memory is wasted if the buffer is too
  289. big, and it may happen that the buffer still is too small. The
  290. solution to this problem is to call the AvailFonts() function
  291. with the buffer size set to 0. AvailFonts() will then return
  292. the number of bytes needed to store the complete list. Allocate
  293. a buffer with this size, and call the AvailFonts() function
  294. once again, but this time give it the new buffer. 
  295.  
  296. Here is an example:
  297.  
  298.   int size;
  299.   struct AvailFontsHeader *avail_fonts_header;
  300.   struct AvailFonts *avail_fonts;
  301.  
  302.   /* Find out which fonts are available both in the memory   */
  303.   /* as well on the disk. The buffer size is set to 0, hence */
  304.   /* the function will return the correct number of bytes    */
  305.   /* needed to store the complete list in:                   */
  306.   size = AvailFonts( NULL, 0, AFF_DISK | AFF_MEMORY );
  307.  
  308.   /* Allocate the buffer: (Now we know what size is needed.) */
  309.   avail_fonts_header = (struct AvailFontsHeadr *)
  310.     AllocMem( size, MEMF_CLEAR );
  311.  
  312.   /* Call the function AvailFonts() again, but this time we give */
  313.   /* it a buffer to store the information in: (Remember to still */
  314.   /* check that the buffer was big enough! Some other task could */
  315.   /* have changed something in the FONTS: device while we        */
  316.   /* allocated the buffer. Never trust the Amiga...)             */
  317.   if( AvailFonts( avail_fonts_header, size, AFF_DISK | AFF_MEMORY ) )
  318.     clean_up( "Buffer to small to store the font list in!" );
  319.  
  320.   /* We can now examine the list. See example 5. */
  321.  
  322.  
  323. When the Amiga tries to load a font it looks in the logical
  324. device "FONTS:". If you have more fonts on another disk you
  325. can reassign the logical device "FONTS:" with help of the
  326. AmigaDOS command "Assign". If you have a collection of nice
  327. fonts in the drawer "MyFonts" on the disk in "df1:" you
  328. call Assign like this: "Assign FONTS: df1:MyFonts" (without
  329. quotations)
  330.  
  331.  
  332.  
  333. 2.4.3  OPEN DISK FONTS
  334.  
  335. You "open" a disk font by initializing a TextAttr structure
  336. with your requirements and call the OpenDiskFont() function.
  337. Remember that the diskfont library must have been opened before
  338. you may use this or the AvailFonts() function. If the font have
  339. not already been loaded into the memory by some other program
  340. it will automatically be done.
  341.  
  342. Synopsis: font = OpenDiskFont( attr );
  343.  
  344. font:     (struct TextFont *) Pointer to a TextFont structure
  345.           which is declared in header file "graphics/text.h".
  346.           See below for more information about this structure.
  347.  
  348. attr:     (struct TextAttr *) Pointer to an already initialized
  349.           TextAttr structure. OpenDiskFont() will try to open
  350.           the font which closes matches your requirements.
  351.  
  352.  
  353. 2.4.4  CLOSE DISK FONTS
  354.  
  355. All fonts you have opened must be closed before your program
  356. terminates. A lot of memory is otherwise wasted. Please be very
  357. careful with this! You close a font with the CloseFont()
  358. function as described above. Both ROM and Disk fonts are closed
  359. with this function.
  360.  
  361. Synopsis: CloseFont( font );
  362.  
  363. font:     (struct TextFont *) Pointer to a previously opened
  364.           TextFont structure. Note that you should NOT try to
  365.           close a font which you have not opened!
  366.  
  367.  
  368.  
  369. 2.5  USE THE NEW FONTS
  370.  
  371. Once you have successfully opened the desired fonts you may
  372. start to use them. As described in the beginning of this
  373. chapter you can either use the low level functions Move() and
  374. Text() or the high level IntuiText structures.
  375.  
  376.  
  377.  
  378. 2.5.1  HIGH LEVEL
  379.  
  380. The high level approach is a clean and nice way to print text.
  381. For short messages it can be a bit tedious since you need to
  382. use some structures just to print some text. These structures
  383. that can feel a bit complicated and unnecessary are extremely
  384. useful and easy to handle if a lot of text is needed. The
  385. advantage with these structures is that they can easily be
  386. combined with each other as well as with other objects like
  387. gadgets, requesters, etc...
  388.  
  389. Here is what you have to do:
  390.  
  391.   1. Initialize a TextAttr structure with your requirements
  392.      as described above.
  393.  
  394.   2. Open the desired font as have also been described above.
  395.  
  396.   3. Initialize the IntuiText structures as normal (see
  397.      chapter 3 Graphics) but set the ITextFont pointer to the
  398.      desired TextAttr structure.
  399.  
  400.   4. Either connect the IntuiTedxt structure to an object
  401.      (gadget, requester etc...) or print it directly with help
  402.      of the PrintIText() function.
  403.  
  404.  
  405. Here is an example: ("my_window" is a pointer to an already
  406. opened window.)
  407.  
  408.   /* Pointer to the diskfont library: */
  409.   struct Library *DiskfontBase;
  410.  
  411.   /* The attributes for our desired font: */   
  412.   struct TextAttr my_font_attr=
  413.   {
  414.     "Courier.font", /* Name of the font.       */
  415.     18,             /* Height, 18 pixels tall. */
  416.     FS_NORMAL,      /* Style, normal.          */
  417.     FPF_DISKFONT    /* Load it from the disk.  */
  418.   };
  419.  
  420.   /* Intuition's text structure: */
  421.   struct IntuiText my_intui_text=
  422.   {
  423.     1,             /* FrontPen, colour register 1. */
  424.     2,             /* BackPen, colour register 2. */
  425.     JAM2,          /* DrawMode, draw the characters with colour 1, */
  426.                    /* on a colour 2 background.                    */
  427.     10, 20,        /* LeftEdge, TopEdge. Position of the text. */
  428.     &my_font_attr, /* ITextFont, use the Courier font. */
  429.     "Hello",       /* IText, the text that will be printed. */
  430.     NULL,          /* NextText, last structure in the list. */
  431.   };
  432.  
  433.  
  434.   /* Open the Intuition Library, windows etc... */
  435.  
  436.  
  437.   /* Open the DiskFont library: */
  438.   DiskfontBase = (struct DiskfontBase *)
  439.     OpenLibrary( "diskfont.library", 0 );
  440.   if( !DiskfontBase )
  441.     clean_up( "Could not open Diskfont library!" );
  442.  
  443.  
  444.   /* Open the desired font: */
  445.   font = OpenDiskFont( &my_font_attr );
  446.  
  447.  
  448.   /* Tell Intuition to print the text: */
  449.   PrintIText( my_window->RPort, &my_intui_text, 0, 0 );
  450.  
  451.  
  452.   /* Close the DiskFont Library: */
  453.   if( DiskfontBase )
  454.     CloseLibrary( DiskfontBase );
  455.  
  456.  
  457.   /* Close the window, Intuition Library etc... */
  458.  
  459.  
  460.  
  461. 2.5.2  LOW LEVEL
  462.  
  463. When it is very little text that should be printed, or you do
  464. not want to mess around with structures you can use the low
  465. level functions Move() and Text(). Before you can use these
  466. functions you have to (of course) open the font as normal, but
  467. also tell the RastPort to use the new font. Use the SetFont()
  468. function to change a RastPort's default font.
  469.  
  470. Synopsis: error = SetFont( rp, font );
  471.  
  472. error:    (long) If OK 0 is returned, else an error number is
  473.           returned which means something went wrong.
  474.  
  475. rp:       (struct RastPort *) Pointer to the RastPort that
  476.           should be affected.
  477.  
  478. font:     (struct TextFont *) Pointer to a TextFont structure
  479.           which has previously been "opened".
  480.  
  481.  
  482.  
  483. The the first character of the text will be printed at the
  484. Rastport's (cp_x, cp_y) coordinate. (The current cp_x and cp_y
  485. values can be found in the Rastport structure. see chapter 12
  486. LOWLEVELGRAPHICS for more information about Rastports).
  487.  
  488. To change the printing position use the function Move()
  489. with a pointer to the Rastport that should be affected and
  490. the new coordinate as parameters.
  491.  
  492. Synopsis:  Move( rast_port, x, y );
  493.  
  494. rast_port: (struct RastPort *) Pointer to the Rastport that
  495.            should be affected.
  496.  
  497. x:         (long) The new X position. 
  498.  
  499. y:         (long) The new Y position.
  500.  
  501.  
  502. When a character is printed the base line will be placed at the
  503. current cp_x, cp_y coordinate. The point below which is marked
  504. with a star (*) is the coordinate for the first character.
  505.  
  506.   00000000000000000000000
  507.   00000000010000000000000
  508.   00000000010000000000000
  509.   00111100010000000000000
  510.   00000010010000000000000
  511.   00000010010000000000000
  512.   00000010010000000000000
  513.   00111110011111000111110
  514.   01000010010000101000010
  515.   01000010010000101000010
  516.   01000010010000101000010
  517.   01000010010000101000010
  518.   *0111111011111000111110 <= Base line
  519.   00000000000000000000010
  520.   00000000000000000000010
  521.   00000000000000001000010
  522.   00000000000000000111100
  523.   00000000000000000000000
  524.  
  525. If the base line is 13 lines below the top of the character, you
  526. must set the Y coordinate to 13 or higher, or the top part of
  527. the characters will not fit.
  528.  
  529.  
  530.  
  531. 2.2.2  PRINT TEXT
  532.  
  533. To print text on the Amiga you can use the low level Text()
  534. function which supports fonts of all sizes and all styles
  535. (more about this later).
  536.  
  537. To print text you need a pointer to the Rastport which should
  538. be affected, a pointer to a text string and finally a value
  539. that tells Text() how many characters of the string should be
  540. printed. Only one line each call may be printed, and no
  541. formatting, word-wrapping etc is done. The Rastports current
  542. font will be used.
  543.  
  544. Synopsis:  Text( rast_port, string, nr_of_chr );
  545.  
  546. rast_port: (struct RastPort *) Pointer to the RastPort that
  547.            should be affected.
  548.  
  549. string:    (char *) Pointer to a text string that will be
  550.            printed.
  551.  
  552. nr_of_chr: (long) The number of characters that should be
  553.            printed.
  554.  
  555.  
  556. Here is an example that prints "Hello" on the display:
  557.   Text( &my_rast_port, "HELLO", 5 );
  558.  
  559.  
  560. The high level IntuiText structure also supports different
  561. types of fonts. See chapter 3 Graphics for more information
  562. about this structure and how to use it.
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569. 2.6  STYLES
  570.  
  571. When you set your requirements in the TextAttr structure you
  572. can among many things specify what style (bold, underlined,
  573. italic, extended or a combination) you want the font to be in.
  574. If you are luck the font with your specified style exist. If
  575. not you can let the Amiga change the font into desired style
  576. by calling the SetSoftStyle() function.
  577.  
  578. Before you use the SetSoftStyle() function you should call the
  579. AskSoftStyle() function to check if you are allowed to change
  580. the font as desired. The routines for changing the font style
  581. may not work very good with some fonts, and you are therefore
  582. sometimes advised not to change the style.
  583.  
  584. For the moment there exist five different styles you may use.
  585. The header file "graphics/text.h" has defined them as:
  586.   FS_NORMAL      Normal style.
  587.   FSF_EXTENDED   Extra wide characters.
  588.   FSF_ITALIC     Italic (characters leaning to the right).
  589.   FSF_BOLD       Extra thick characters.
  590.   FSF_UNDERLINED Underlined characters.
  591.  
  592. To produce a combination of the styles you simply put the
  593. binary operator OR (|) between the flags.
  594.  
  595.  
  596. Note that you should always first try to load the font with the
  597. desired style. It is only when the desired style does not exist
  598. you should try to modify it with the SetSoftStyle() function.
  599.  
  600. Synopsis:  a_style = AskSoftStyle( rast_port )
  601.  
  602. a_style:   (UWORD) The function returns a bit field where the
  603.            allowed style bits for the checked font are set. This
  604.            value should be used as a parameter when you call
  605.            the SetSoftStyle() function.
  606.  
  607. rast_port: (struct RastPort *) Pointer to the rastport to which
  608.            the font you want to check is connected.
  609.  
  610.  
  611. Once you know which styles you may use you can change the font
  612. by calling the SetSoftStyle() function.
  613.  
  614. Synopsis:  new_style = SetSoftStyle( rast_port, style, a_style );
  615.  
  616. new_style: (UWORD) The function will only create the styles it
  617.            is allowed to do (see a_styles), and it may therefore
  618.            happen that the function will not generate all of the
  619.            styles you wanted. This returned value tells us which
  620.            style bits it used.
  621.  
  622. rast_port: (struct RastPort *) Pointer to the rastport to which
  623.            the font you want to change is connected.
  624.  
  625. style:     (UWORD) The desired style.
  626.  
  627. a_style:   (UWORD) The styles you may use. This value was
  628.            returned by AskSoftStyle(). If you want to be able
  629.            to use all styles and do not care if some styles
  630.            would look strange set this field to 0xFFFF (all
  631.            styles allowed). This can result in some very ugly
  632.            styles, and is therefore not recommended.
  633.  
  634.  
  635. Here is an example:
  636.  
  637.   UWORD style;     /* Desired style.  */
  638.   UWORD a_style;   /* Styles allowed. */
  639.   UWORD new_style; /* Style we got.   */
  640.  
  641.  
  642.   /* Set the desired style: (A combination of underlined, */
  643.   /* bold and italic.)                                    */
  644.   style = FSF_UNDERLINED | FSF_BOLD | FSF_ITALIC;
  645.  
  646.   /* Check which styles we may use: */
  647.   a_style = AskSoftStyle( my_window->RPort );
  648.   
  649.   /* Change the window's font style: */
  650.   new_style = SetSoftStyle( my_window->RPort, style, a_style );
  651.  
  652.   /* Tell the user what style we will use: */
  653.   printf( "Style:" );
  654.   if( new_style )
  655.     printf( "%s%s%s!\n",
  656.       new_style & FSF_UNDERLINED ? " Underlined" : "",
  657.       new_style & FSF_BOLD ? " Bold" : "",
  658.       new_style & FSF_ITALIC ? " Italic" : "" );
  659.   else
  660.     printf( " normal!" );
  661.   printf( "!\n" );
  662.  
  663.  
  664.  
  665. 2.7  CREATING YOUR OWN FONTS
  666.  
  667. If you want to create a new font yourself you should use the
  668. font editor program ("fed") which is included on the "Extras"
  669. disk you received when you bought your Amiga. To create your
  670. own fonts without this types of utility is very complicated.
  671. However, if you want to create a very small font set with a
  672. very limited number of characters it is possible to do it. I
  673. will here explain how to do this since it is rather interesting
  674. and good to know how a font set is actually constructed.
  675.  
  676. If you want to include a font set together with your program
  677. code you do actually not need to do very much. I have written
  678. a small utility called PrintFont (in drawer "Include Font")
  679. which will load a specified font and print all information
  680. about it in C code. This code can then simply be included in
  681. your own program code.
  682.  
  683. A font consists of:
  684.  
  685.   1. A TextFont structure to which all other information of
  686.      the font is connected to.
  687.  
  688.   2. A memory area where the graphics of the font's characters
  689.      are declared. (Character data)
  690.  
  691.   3. A list of data which tells us where each character's
  692.      fontdata begins and how wide each character is.
  693.   
  694.   4. If it is a proportional font (each character has it's own
  695.      width, for example an "i" is not as wide as a "W") we
  696.      need information about how much space is needed between
  697.      each character when printed. (Character Space). All
  698.      proportional fonts does not need this array. If it does
  699.      not exist the nominal width (tf_XSpace) will be used.
  700.  
  701.   5. Finally, if the font is proportional we also need
  702.      information about how many pixels to the right each
  703.      character should be placed inside the the "character
  704.      space". All proportional fonts does not need this array.
  705.      If it does not exist the kerning (x offset) will be 0.
  706.  
  707.  
  708.   
  709. 2.7.1  TEXTFONT STRUCTURE
  710.  
  711. The TextFont structure which is declared in header file
  712. "graphics/text.h" is the foundation of all fonts. It consists
  713. of all information which is needed for the system to be able
  714. to print the characters. The structure looks like this:
  715.  
  716. struct TextFont
  717. {
  718.   struct Message tf_Message;
  719.   UWORD tf_YSize;
  720.   UBYTE tf_Style;
  721.   UBYTE tf_Flags;
  722.   UWORD tf_XSize;
  723.   UWORD tf_Baseline;
  724.   UWORD tf_BoldSmear;
  725.   UWORD tf_Accessors;
  726.   UBYTE tf_LoChar;
  727.   UBYTE tf_HiChar;
  728.   APTR  tf_CharData;
  729.   UWORD tf_Modulo;
  730.   APTR  tf_CharLoc;
  731.   APTR  tf_CharSpace;
  732.   APTR  tf_CharKern;
  733. };
  734.  
  735. tf_Message:   The top part of the text font structure consists
  736.               of a message are. It is used by the system to
  737.               communicate with other parts of the system. If
  738.               the font is removed for example, a message is
  739.               sent to all involved parts of the system.
  740.               
  741.               The Message structure is defined in header file
  742.               "exec/ports.h" as:
  743.                             
  744.               struct Message
  745.               {
  746.                 struct Node mn_Node;
  747.                 struct MsgPort *mn_ReplyPort;
  748.                 UWORD mn_Length;
  749.               };
  750.               
  751.               The Node structure is defined in header file
  752.               "exec/nodes.h" as:
  753.               
  754.               struct Node
  755.               {
  756.                 struct Node *ln_Succ;
  757.                 struct Node *ln_Pred;
  758.                 UBYTE  ln_Type;
  759.                 BYTE   ln_Pri;
  760.                 char *ln_Name;
  761.               };
  762.               
  763.               See chapter 16 "Messages" for more information
  764.               about these structures.
  765.               
  766.               If you want to initialize your own TextFont
  767.               structure you should set the ln_Succ and ln_Pred
  768.               field of the Node structure to NULL. The ln_Type
  769.               to "NT_FONT" (font node), the ln_Pri to 0 (normal
  770.               priority), and finally the ln_Name to a string
  771.               which contains the name of the font.
  772.               
  773.               The mn_ReplyPort pointer of the Message structure
  774.               should be set to NULL (Exec will take care of this
  775.               later), and the length to the number of bytes is
  776.               needed to store the whole font (including this
  777.               structure, the name, and the arrays described
  778.               below).  
  779.               
  780. tf_YSize:     The height of the font (number of pixels/lines).
  781.  
  782. tf_Style:     The style bits as described above:
  783.                 FS_NORMAL      Normal style.
  784.                 FSF_EXTENDED   Extra wide characters.
  785.                 FSF_ITALIC     Italic.
  786.                 FSF_BOLD       Extra thick characters.
  787.                 FSF_UNDERLINED Underlined characters.
  788.  
  789. tf_Flags:     The font's special flags:
  790.  
  791.                 FPF_ROMFONT      The font is located in the ROM.
  792.  
  793.                 FPF_DISKFONT     The font is loaded from a disk.
  794.                                  All fonts you design yourself
  795.                                  must have this flag set unless
  796.                                  you intend to burn your own
  797.                                  memory chips.
  798.  
  799.                 FPF_REVPATH      The font should be printed in
  800.                                  the opposite direction (right
  801.                                  to left).
  802.  
  803.                 FPF_TALLDOT      The font is specially designed
  804.                                  for high resolution screens
  805.                                  with no interlace. (Each pixel
  806.                                  is only half as wide as it is
  807.                                  tall.)
  808.                                  
  809.                 FPF_WIDEDOT      The font is specially designed
  810.                                  for low resolution screens
  811.                                  which are interlaced. (Each
  812.                                  pixel is only half as tall as
  813.                                  it is wide.)
  814.  
  815.                 FPF_PROPORTIONAL The font is proportional. The
  816.                                  width of each character will
  817.                                  vary depending on how wide the
  818.                                  character is itself. The box
  819.                                  containing an "i" will (usually)
  820.                                  not be as wide as a "w" for
  821.                                  example.
  822.                                  
  823.                 FPF_DESIGNED     If you have designed the font
  824.                                  for the size specified in
  825.                                  the "tf_ YSize" field this
  826.                                  flag should be set. If a
  827.                                  program has constructed this
  828.                                  size of the font the flag
  829.                                  should not be set. (The
  830.                                  graphical quality of a
  831.                                  Constructed font is usually not
  832.                                  as good as a font which has
  833.                                  been designed for this size.) 
  834.  
  835.                 FPF_REMOVED      This flag is set by the system
  836.                                  when it has been removed.
  837.  
  838. tf_XSize:     The nominal width of each character. If the font
  839.               is normal (non proportional) this is the width
  840.               between the first pixels of two characters. If a
  841.               proportional font is used a special array of
  842.               different width for each character may be used.
  843.  
  844. tf_Baseline:  The number of pixels down the baseline is from the
  845.               top of the characters. You may not use a base line
  846.               which is greater than the nominal height - 1
  847.               (tf_YSize-1), or the system may crash!
  848.  
  849. tf_BoldSmear: When you change the style to bold by calling the
  850.               SetSoftStyle() function a copy of the font is
  851.               placed on top of itself and a bit to the right.
  852.               The further to the right, the bolder characters.
  853.               This value represents the number of pixels to the
  854.               right the characters should be moved. This value
  855.               is usually set to 1, but large fonts usually need
  856.               larger values.
  857.  
  858. tf_Accessors: Several programs may use the same font
  859.               simultaneously, and this value represents the
  860.               current number of users. Each time the font
  861.               is opened by a program this value is increased,
  862.               and each time some one closes the font this value
  863.               is decreased.
  864.  
  865. tf_LoChar:    A font can consist of up to 256 characters, but
  866.               usually the font is much smaller. You can for
  867.               example have a font which only consists of
  868.               capital letters (A, B, C, .. Y, Z). This field
  869.               tells us and the system which is the first
  870.               character. In our example the value would be set
  871.               to 65 (ASCII 65 = 'A').
  872.  
  873. tf_HiChar:    The last character in this font. In our example
  874.               above this value would be set to 90 (ASCII 90 =
  875.               'Z').
  876.  
  877. tf_CharData:  Pointer to the character data (the graphics). See
  878.               below for more information.
  879.  
  880. tf_Modulo:    The graphics (character data) for the characters
  881.               are organized into lines. First comes the top line
  882.               of all characters, then the second line and so
  883.               on... This value represents the number of bytes
  884.               needed for each line.
  885.  
  886. tf_CharLoc:   Pointer to a list of data which tells us where
  887.               each character's data begins and how wide each
  888.               character is.
  889.  
  890. tf_CharSpace: Pointer to an array of space information - how
  891.               much space is needed between each character when
  892.               printed. If this pointer is NULL the nominal
  893.               width (tf_XSpace) will be used for all
  894.               characters.
  895.               
  896. tf_CharKern:  Pointer to an array of kerning data - how many
  897.               pixels to the right the character should be moved
  898.               inside its box (character space) when printed. If
  899.               the pointer is NULL the kerning (x offset) will
  900.               be 0.
  901.  
  902.  
  903.  
  904. 2.7.2  FONT (CHARACTER) DATA
  905.  
  906. The graphics for the characters are organized into an array
  907. of bit packed character data organized into words. Let's say
  908. we want to create our own font of five characters - A, B, C,
  909. D, and E. They should look like this:
  910.  
  911.    ****    *****     ****    ****     ****** 
  912.   **   *   **   *   **   *   **  *    **     
  913.   **   *   **   *   **       **   *   **     
  914.   ******   *****    **       **   *   *****  
  915.   **   *   **   *   **       **   *   **     
  916.   **   *   **   *   **   *   **  *    **     
  917.   **   *   *****     ****    ****     ****** 
  918.  
  919.  
  920. Although our font consist of five characters, we must also
  921. define an extra one which will be used when an non existing
  922. character is printed. If we try to print the character G
  923. which does not exist, this special character will be printed.
  924. This character is usually referred as the "not in this font
  925. character". In our example we will use a black box which
  926. looks like this:
  927.  
  928.   ********
  929.   ********
  930.   ********
  931.   ********
  932.   ********
  933.   ********
  934.   ********
  935.   ********
  936.  
  937.  
  938. The characters should now be translated into C code. This
  939. is easiest done if you write the characters on a grid paper
  940. and organizes them into groups of four squares. Each group
  941. (binary values) can then easily be translated into hexadecimal
  942. as the following table shows: (Each marked square on your paper
  943. represents the digit '1' and each empty square represents the
  944. digit `0')
  945.  
  946.   Bin   Hex
  947.   ---------
  948.   0000    0
  949.   0001    1
  950.   0010    2
  951.   0011    3
  952.  
  953.   0100    4
  954.   0101    5
  955.   0110    6
  956.   0111    7
  957.  
  958.   1000    8
  959.   1001    9
  960.   1010    A
  961.   1011    B
  962.  
  963.   1100    C
  964.   1101    D
  965.   1110    E
  966.   1111    F
  967.  
  968.  
  969. In our example our characters would be translated like this:
  970.  
  971. -------------------------------------------------------------------------
  972.        A        B        C        D        E        *    A  B  C  D  E  *
  973. -------------------------------------------------------------------------
  974. 00111100 01111100 00111100 01111000 01111110 11111111   3C 7C 3C 78 7E FF
  975. 01100010 01100010 01100010 01100100 01100000 11111111   62 62 62 64 60 FF
  976. 01100010 01100010 01100000 01100010 01100000 11111111   62 62 60 62 60 FF
  977. 01111110 01111100 01100000 01100010 01111100 11111111   7E 7C 60 62 7C FF
  978. 01100010 01100010 01100000 01100010 01100000 11111111   62 62 60 62 60 FF
  979. 01100010 01100010 01100010 01100100 01100000 11111111   62 62 62 64 60 FF
  980. 01100010 01111100 00111100 01111000 01111110 11111111   62 7C 3C 78 7E FF
  981. 00000000 00000000 00000000 00000000 00000000 11111111   00 00 00 00 00 FF
  982. -------------------------------------------------------------------------
  983.  
  984.  
  985. Finally we put the hexadecimal values into an array of words:
  986.  
  987. /* The font data: */
  988. UWORD MyOwnFontData[24]=
  989. {
  990.   0x3C7C,0x3C78,0x7EFF, /* Row 0 */
  991.   0x6262,0x6264,0x60FF, /*  "  1 */
  992.   0x6262,0x6062,0x60FF, /*  "  2 */
  993.   0x7E7C,0x6062,0x7CFF, /*  "  3 */
  994.   0x6262,0x6062,0x60FF, /*  "  4 */
  995.   0x6262,0x6264,0x60FF, /*  "  5 */
  996.   0x627C,0x3C78,0x7EFF, /*  "  6 */
  997.   0x0000,0x0000,0x00FF  /*  "  7 */
  998. };
  999.  
  1000.  
  1001.  
  1002. 2.7.3  CHARACTER LOCATION
  1003.  
  1004. Secondly we need to tell the computer where each character exist
  1005. in the character data, and how wide the character is. In our
  1006. example all characters had the same width (8 pixels), but if we
  1007. use a proportional font each character may have its own width.
  1008.  
  1009. For every character two words are needed. The first word
  1010. represents the offset position (the location of the character
  1011. in the character data). The second word represents the width
  1012. (in bits) of the character. 
  1013.  
  1014. In our example the character A has the offset value 0 since
  1015. it is the first character. The second character (B) has the
  1016. offset value 8 since the A was 8 bits wide. The third character
  1017. has the offset value 16 (in hexadecimal it is 10) since both A
  1018. and B was each 8 bits wide, and so on... All this information
  1019. is stored in an array of "longs" (two words).
  1020.  
  1021. /* The location and width of each character: */
  1022. ULONG MyOwnFontLoc[5]=
  1023. {
  1024.   0x00000008, /* A: Offset  0[hex], Width 8 bits */
  1025.   0x00080008, /* B: Offset  8[hex], Width 8 bits */
  1026.   0x00100008, /* C: Offset 10[hex], Width 8 bits */
  1027.   0x00180008, /* D: Offset 18[hex], Width 8 bits */
  1028.   0x00200008  /* E: Offset 20[hex], Width 8 bits */
  1029. };
  1030.  
  1031.  
  1032.  
  1033. 2.7.4  CHARACTER SPACE
  1034.  
  1035. Normally the default width (tf_XSize) is used as the space
  1036. between the first pixel of two character. If the tf_Size is
  1037. 12, the second character will be printed 12 pixels to the
  1038. right and so on... However, if you are using a proportional
  1039. font, each character may have its own space. The tf_CharSpace
  1040. field should in this case point to an array of words where
  1041. each word represents the space of one character. If the
  1042. tf_CharSpace field is NULL the nominal width will be used.
  1043. (See illustration "Proportional Fonts".)
  1044.  
  1045. In our example we used a normal (non proportional) font, and
  1046. hence we do not need any array of space information.
  1047.  
  1048.  
  1049.  
  1050. 2.7.5  CHARACTER KERNING
  1051.  
  1052. Some proportional fonts are using "kerning", which is a list
  1053. of offset values. These offset values represent the number of
  1054. pixels each character will be moved to the right inside its own
  1055. character space. The tf_CharKern field must contain the address
  1056. of this kerning list of words, or the kerning value 0 will be
  1057. used. (See illustration "Proportional Fonts".)
  1058.  
  1059. In our example we used a normal (non proportional) font, and
  1060. hence we do not need any array of kerning data.
  1061.  
  1062.  
  1063.  
  1064. 2.7.6  OUR OWN FONT EXAMPLE
  1065.  
  1066. In our example the complete C code should look like this:
  1067.  
  1068.  
  1069. #include <exec/types.h>
  1070. #include <graphics/text.h>
  1071.  
  1072. /* The font data: */
  1073. UWORD MyOwnFontData[24]=
  1074. {
  1075.   0x3C7C,0x3C78,0x7EFF, /* Row 0 */
  1076.   0x6262,0x6264,0x60FF, /*  "  1 */
  1077.   0x6262,0x6062,0x60FF, /*  "  2 */
  1078.   0x7E7C,0x6062,0x7CFF, /*  "  3 */
  1079.   0x6262,0x6062,0x60FF, /*  "  4 */
  1080.   0x6262,0x6264,0x60FF, /*  "  5 */
  1081.   0x627C,0x3C78,0x7EFF, /*  "  6 */
  1082.   0x0000,0x0000,0x00FF  /*  "  7 */
  1083. };
  1084.  
  1085. /* The location and width of each character: */
  1086. ULONG MyOwnFontLoc[5]=
  1087. {
  1088.   0x00000008, /* A: Offset  0[hex], Width 8 bits */
  1089.   0x00080008, /* B: Offset  8[hex], Width 8 bits */
  1090.   0x00100008, /* C: Offset 10[hex], Width 8 bits */
  1091.   0x00180008, /* D: Offset 18[hex], Width 8 bits */
  1092.   0x00200008  /* E: Offset 20[hex], Width 8 bits */
  1093. };
  1094.  
  1095. /* The text font structure: */
  1096. struct TextFont MyOwnFontFont=
  1097. {
  1098.   {
  1099.     /* Message */
  1100.     {
  1101.       /* Node */
  1102.       NULL,              /* ln_Succ */
  1103.       NULL,              /* ln_Pred */
  1104.       NT_FONT,           /* ln_Type */
  1105.       0,                 /* ln_Pri  */
  1106.       "OurFont.font"     /* ln_Name */
  1107.     },
  1108.     NULL,                /* mn_ReplyPort */
  1109.     72                   /* mn_Length    */
  1110.   },
  1111.       8,                 /* tf_YSize     */
  1112.       0,                 /* tf_Style     */
  1113.      66,                 /* tf_Flags     */
  1114.       8,                 /* tf_XSize     */
  1115.       6,                 /* tf_Baseline  */
  1116.       1,                 /* tf_BoldSmear */
  1117.       0,                 /* tf_Accessors */
  1118.      65,                 /* tf_LoChar    */
  1119.      69,                 /* tf_HiChar    */
  1120.   (APTR) &MyOwnFontData, /* tf_CharData  */
  1121.       6,                 /* tf_Modulo    */
  1122.   (APTR) &MyOwnFontLoc,  /* tf_CharLoc   */
  1123.    NULL,                 /* tf_CharSpace */
  1124.    NULL,                 /* tf_CharKern  */
  1125. };
  1126.  
  1127.  
  1128.  
  1129. 2.8  FUNCTIONS
  1130.  
  1131. OpenFont()
  1132.  
  1133.   This function is used to get access to a ROM font. You
  1134.   initialize a TextAttr structure with your requirements,
  1135.   and send a pointer to it as the only parameter. If
  1136.   OpenFont() finds the font it returns a pointer to a
  1137.   TextFont structure and tells the system that you are using
  1138.   the font. Remember to close all fonts you have opened with
  1139.   the CloseFont() function.
  1140.  
  1141.   Synopsis: font = OpenFont( attr );
  1142.  
  1143.   font:     (struct TextFont *) Pointer to a TextFont structure
  1144.             or NULL if OpenFont() could not find the font.
  1145.  
  1146.   attr:     (struct TextAttr *) Pointer to an initialized
  1147.             TextAttr structure. OpenFont() will try to open the
  1148.             font which closes matches your requirements.
  1149.  
  1150.  
  1151. CloseFont()
  1152.  
  1153.   All fonts you have opened with the OpenFont() function must
  1154.   be "closed" before your program terminates! You close ROM
  1155.   fonts by calling the CloseFont() function.
  1156.  
  1157.   Synopsis: CloseFont( font );
  1158.  
  1159.   font:     (struct TextFont *) Pointer to a previously opened
  1160.             TextFont structure. Note that you should NOT try to
  1161.             close a font which you have not opened!
  1162.  
  1163.  
  1164. AvailFonts()
  1165.  
  1166.   This function will scan through the font directory of the
  1167.   system disk, and return a complete list of available fonts.
  1168.   Note that you must have opened the DiskFont Library before
  1169.   you may call this function.
  1170.  
  1171.   Synopsis: missing = AvailFonts( buffer, size, type );
  1172.  
  1173.   missing:  (long) If the buffer was not big enough to store
  1174.             the complete list of fonts in the extra number of
  1175.             bytes needed is returned. If 0 is returned the
  1176.             buffer was big enough for a complete list of fonts.
  1177.  
  1178.   buffer:   (char *) Pointer to some memory were the list of
  1179.             fonts can be stored.
  1180.           
  1181.   size:     (long) The size of the buffer (in bytes).
  1182.  
  1183.   type:     (long) If you want to look for available fonts
  1184.             which are already in the memory set the flag
  1185.             "AFF_MEMORY". If you want to search the disk for
  1186.             available fonts, set the flag "AFF_DISK". To
  1187.             search both the memory and the disk set both flags
  1188.             with the binary OR operator between:
  1189.             "AFF_DISK | AFF_MEMORY".
  1190.  
  1191.  
  1192. OpenDiskFont()
  1193.  
  1194.   To load fonts from the disk and open them use the
  1195.   OpenDiskFont() function. Note that you must have opened the
  1196.   DiskFont Library before you may call this function. Remember
  1197.   to close all fonts you have opened!
  1198.   
  1199.   Synopsis: font = OpenDiskFont( attr );
  1200.  
  1201.   font:     (struct TextFont *) Pointer to a TextFont structure
  1202.             or NULL if OpenFont() could not find the font.
  1203.           
  1204.   attr:     (struct TextAttr *) Pointer to an initialized
  1205.             TextAttr structure. OpenDiskFont() will try to open
  1206.             the font which closes matches your requirements.
  1207.  
  1208.  
  1209. SetFont()
  1210.  
  1211.   This function will change a RastPort's font. The font must
  1212.   of course have been successfully opened before you may start
  1213.   to use it.
  1214.  
  1215.   Synopsis: error = SetFont( rp, font );
  1216.  
  1217.   error:    (long) If OK 0 is returned, else an error number is
  1218.             returned which means something went wrong.
  1219.  
  1220.   rp:       (struct RastPort *) Pointer to the RastPort that
  1221.             should be affected.
  1222.  
  1223.   font:     (struct TextFont *) Pointer to a TextFont structure
  1224.             which has previously been "opened".
  1225.  
  1226.  
  1227. AskSoftStyle()
  1228.  
  1229.   This function tells us how a specified font may be changed,
  1230.   and which styles may be automatically created. Use the
  1231.   function SetSoftStyle() to later change style. The reason why
  1232.   you have to check if you are allowed to alter the style is
  1233.   that some fonts may look very bad when altered.
  1234.   
  1235.   Note that you should always first try to load the font with
  1236.   the desired style. It is only when the desired style does not
  1237.   exist you should try to modify it with the SetSoftStyle()
  1238.   function.
  1239.  
  1240.   Synopsis:  a_style = AskSoftStyle( rast_port )
  1241.  
  1242.   a_style:   (UWORD) The function returns a bit field where the
  1243.              allowed style bits for the checked font are set. This
  1244.              value should be used as a parameter when you later
  1245.              call the SetSoftStyle() function.
  1246.  
  1247.   rast_port: (struct RastPort *) Pointer to the rastport to
  1248.              which the font you want to check is connected.
  1249.  
  1250.  
  1251. SetSoftStyle()
  1252.  
  1253.   This function will alter the style of a specified font. You
  1254.   should first find out which styles you may alter by calling
  1255.   the AskSoftStyle() function before you call this function.
  1256.  
  1257.   Synopsis:  new_style = SetSoftStyle( rp, style, a_style );
  1258.  
  1259.   new_style: (UWORD) The function will only create the styles
  1260.              it is allowed to do (see a_styles), and it may
  1261.              therefore happen that the function will not
  1262.              generate all of the styles you wanted. This
  1263.              returned value tells us which style bits it used.
  1264.  
  1265.   rp:        (struct RastPort *) Pointer to the rastport to
  1266.              which the font you want to change is connected.
  1267.  
  1268.   style:     (UWORD) The desired style.
  1269.  
  1270.   a_style:   (UWORD) The styles you may use. This value was
  1271.              returned by AskSoftStyle(). If you want to be able
  1272.              to use all styles and do not care if some styles
  1273.              would look strange set this field to 0xFFFF (all
  1274.              styles allowed). This can result in some very ugly
  1275.              styles, and is therefore not recommended.
  1276.  
  1277.  
  1278. ClearEOL()
  1279.  
  1280.   This function will clear the area to the right of the current
  1281.   position. The height of the area which is cleared is set to
  1282.   fit the current font height.
  1283.   
  1284.   Synopsis: ClewarEOL( rp );
  1285.  
  1286.   rp:       (struct RastPort *) Pointer to a rastport. The area
  1287.             from the current position to the right edge of the
  1288.             rastport is cleared. The height of the area
  1289.             depends on the current font size. Normally is the
  1290.             cleared area set to colour 0, but if you are using
  1291.             draw mode "JAM2" will the area be filled with the
  1292.             BgPen colour.
  1293.  
  1294.  
  1295. ClearScreen()
  1296.  
  1297.   This function will clear the area to the right of the current
  1298.   position and the area below.
  1299.  
  1300.   Synopsis: ClewarScreen( rp );
  1301.  
  1302.   rp:       (struct RastPort *) Pointer to a rastport. The area
  1303.             from the current position to the right edge of the
  1304.             rastport is cleared. The area below is also cleared.
  1305.             Normally is the cleared area set to colour 0, but
  1306.             if you are using draw mode "JAM2" will the area be
  1307.             filled with the BgPen colour.
  1308.  
  1309.  
  1310. TextLength()
  1311.  
  1312.   This function will return the number of pixels wide the text
  1313.   string would be if printed with the rastport's current font.
  1314.  
  1315.   Synopsis: width = TextLength( rp, string, nr_chars );
  1316.   
  1317.   width:    (long) Number of pixels wide the text string would
  1318.             be if printed with the rastport's current font.
  1319.   
  1320.   rp:       (struct RastPort *) Pointer to the rastport.
  1321.   
  1322.   string:   (char *) Pointer to the string containing the text
  1323.             you want to measure.
  1324.   
  1325.   nr_chars: (long) Number of characters in the string that
  1326.             should be counted.
  1327.  
  1328.  
  1329.  
  1330. 2.9  EXAMPLES
  1331.  
  1332. Example 1
  1333.   This example shows how to open the ROM font "Topaz". (Topaz
  1334.   is the standard system font, and is placed in ROM on all
  1335.   Amigas. If you have told preferences to use a 60-character
  1336.   display the 9 pixel size will be used, else (80-character
  1337.   display) the 8 pixel size will be used. This example prints
  1338.   some text in both sizes.
  1339.  
  1340. Example 2
  1341.   This example demonstrates how to change the style of a font.
  1342.   We will open the ROM font "Topaz" and change the style to
  1343.   underlined, bold and italic. Well, we try to use all
  1344.   mentioned styles, but it may happen that we are not allowed
  1345.   to use some styles.
  1346.  
  1347. Example 3
  1348.   This example demonstrates how to open a disk font (Opal, 12)
  1349.   and prints some characters with the new font in a window.
  1350.   Note! The font "Opal" must exist in the systems FONT:
  1351.   directory or you will receive an error message!
  1352.  
  1353. Example 4
  1354.   This example opens disk fonts and prints some interesting
  1355.   information about them. (Height, width, flags, style, etc...)
  1356.   Syntax: Example4 [font1] [font2] [font3] ...
  1357.   (The largest size of each font will be used.)
  1358.  
  1359. Example 5
  1360.   This example demonstrates how to use the AvailFonts()
  1361.   function. All available fonts (both on the disk as well as in
  1362.   the memory) will be listed together with some useful
  1363.   information about them.
  1364.  
  1365. Example 6
  1366.   This example demonstrates how you can use a font loaded from
  1367.   a disk in your own Intuition programs.
  1368.